package methodminxin.manymixin

class UpperCaseFilter {
    void write(String message){
        def upperCase = message.toUpperCase()
        //将转换后的消息传递给下一个mixin链条
        def clazz = this.getClass()
        //遍历mixin的链表,找到当前mixin的前一个
        /**
         * mixedIn: groovy提供的一个属性,为实例保存有序的mixin注入类链表
         */
        for(mixin in mixedIn.mixinClasses){
            //会按添加顺序从前往后开始遍历,如果实例不是当前实例,那么就继续
            //直到找到当前实例时,执行的clazz是前一个mixin,最后一个mixin的是目标实例
            if(mixin.mixinClass.theClass==metaClass.delegate.theClass) break
            clazz=mixin.mixinClass.theClass  //一直赋值,break时,clazz刚好是当前实例的前一个
        }
        //如果当前实例在mixin中,执行当前实例方法,否则执行目标实例方法
        mixedIn[clazz].write(upperCase)
    }
}
